package com.paradigmatecnologico;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer;
import org.apache.solr.client.solrj.request.AbstractUpdateRequest;
import org.apache.solr.client.solrj.request.ContentStreamUpdateRequest;
import org.apache.solr.client.solrj.response.UpdateResponse;
import org.apache.solr.common.util.NamedList;

public class Index {

	private static final String url = "http://localhost:8080/solr";

	private static final String pathFile = "productos.xml";

	public static void main(String[] args) throws HttpException, IOException, SolrServerException {

		// indexViaHttp();
		// commit();
		// indexPdf();

	}

	/**
	 * 
	 * Indexa via http
	 * 
	 * @throws IOException
	 * @throws HttpException
	 * @throws MalformedURLException
	 * @throws SolrServerException
	 */
	private static void indexViaHttp() throws IOException, HttpException, MalformedURLException, SolrServerException {
		// url del servidor y su request handler para las indexaciones
		PostMethod post = new PostMethod(url + "/mp3" + "/update");
		HttpClient h = new HttpClient();

		// cargamos el xml
		InputStream is = Index.class.getClassLoader().getResourceAsStream(pathFile);
		post.setRequestEntity(new InputStreamRequestEntity(is));
		post.setRequestHeader("Content-type", "text/xml; charset=UTF-8");

		try {
			// llamada al servidor
			int status = h.executeMethod(post);

			// Display status code
			System.out.println("Response status code: " + status);

			// Display response
			System.out.println("Response body: ");
			System.out.println(post.getResponseBodyAsStream());
		} finally {
			post.releaseConnection();
		}

	}

	/**
	 * commit -> Solr permite ir indexando documentos sin que se vean en las busquedas. Esto se debe al uso de caches que contienen una serie de bitsets que se corresponden con los documentos indexados y actualmente buscados
	 * y cargados en memoria. Si se añaden nuevos documentos, estos bitsets no sirven porque hay que volver a generarlos de nuevo con los documentos añadidos, con lo que hay que volver a regenerar las caches, con la
	 * consecuente perdida de rendimiento
	 * 
	 * @throws SolrServerException
	 * @throws IOException
	 */
	private static void commit() throws SolrServerException, IOException {
		CommonsHttpSolrServer solrServer = new CommonsHttpSolrServer(url + "/mp3");
		UpdateResponse response = solrServer.commit();
	}

	/**
	 * Indexa un pdf con solrCell. El servidor Solr debe tener las librerias apropiadas de tika.
	 * 
	 * @throws SolrServerException
	 * @throws IOException
	 */
	private static void indexPdf() throws SolrServerException, IOException {
		CommonsHttpSolrServer server = new CommonsHttpSolrServer(url + "/pdf");

		ContentStreamUpdateRequest up = new ContentStreamUpdateRequest("/update/extract");
		up.addFile(new File("/path/file.pdf"));
		up.setParam("literal.id", "solr_1.4");
		up.setAction(AbstractUpdateRequest.ACTION.COMMIT, true, true);
		NamedList<Object> result = server.request(up);
	}

}
